package com.hello.template_method;

/**
 * 模板模式
 * 定义一个稳定的算法流程
 * 1、父类含有稳定的框架
 * 2、子类重写变化部分
 */
public abstract class Lib {

    /**
     * 固定的算法流程/框架,定义为final避免子类覆盖
     */
    public final void run() {
        step1();

        if (step2()) { // 支持变化，多态调用
            step3();
        }
        for (int i=0; i<4; i++){
            step4();// 支持变化，多态调用
        }

        step5();

    }

    protected void step1() {
        System.out.println("Lib:step1");
    };
    protected void step3() {
        System.out.println("Lib:step3");
    };
    protected void step5() {
        System.out.println("Lib:step5");
    };
    protected boolean step2() {
        System.out.println("Lib:step2");
        return false;};
    protected void step4() {
        System.out.println("Lib:step4");
    };
}